﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Printing;
using System.Globalization;

namespace RiskMan.DataClass.Models.Plaza_II.FortsFutInfoRepl
{
    /// <summary>
    /// Таблица 27. Поля таблицы delivery_report - Отчет о поставке
    /// </summary>
    public class DeliveryReport : INotifyPropertyChanged
    {
        #region private

        private long _replId;
        private long _replRev;
        private long _replAct;
        private DateTime _date;
        private string _clientCode;
        private string _type;
        private int _isinId;
        private int _pos;
        private int _posExcl;
        private int _posUnexec;
        private int _unexec;
        private string _settlPair;
        private string _assetCode;
        private string _issueCode;
        private Decimal _obligRur;
        private long _obligQty;
        private Decimal _fulfilRur;
        private long _fulfilQty;
        private int _step;
        private int _sessId;
        private int _idGen;

        #endregion

        #region public

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplId
        {
            get { return _replId; }
            set
            {
                if (_replId != value)
                {
                    _replId = value;
                    RaisePropertyChanged("ReplId");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplRev
        {
            get { return _replRev; }
            set
            {
                if (_replRev != value)
                {
                    _replRev = value;
                    RaisePropertyChanged("ReplRev");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplAct
        {
            get { return _replAct; }
            set
            {
                if (_replAct != value)
                {
                    _replAct = value;
                    RaisePropertyChanged("ReplAct");
                }
            }
        }

        /// <summary>
        /// Дата проведения клиринга
        /// </summary>
        public DateTime Date
        {
            get { return _date; }
            set
            {
                if (_date != value)
                {
                    _date = value;
                    RaisePropertyChanged("Date");
                }
            }
        }

        /// <summary>
        /// Код клиента
        /// </summary>
        public string ClientCode
        {
            get { return _clientCode; }
            set
            {
                if (_clientCode != value)
                {
                    _clientCode = value;
                    RaisePropertyChanged("ClientCode");
                }
            }
        }

        /// <summary>
        /// Признак РФ/БФ/клиента ('RF' - РФ; 'BF' - БФ; 'CL' - клиент). Здесь всегда равен 'CL'
        /// </summary>
        public string Type
        {
            get { return _type; }
            set
            {
                if (_type != value)
                {
                    _type = value;
                    RaisePropertyChanged("Type");
                }
            }
        }

        /// <summary>
        /// Уникальный числовой идентификатор инструмента
        /// </summary>
        public int IsinId
        {
            get { return _isinId; }
            set
            {
                if (_isinId != value)
                {
                    _isinId = value;
                    RaisePropertyChanged("IsinId");
                }
            }
        }

        /// <summary>
        /// Количество позиций, подлежащих исполнению, на начало
        /// данного этапа поставки (кроме исключенных по принципу совпадения ИНН (кодов))
        /// </summary>
        public int Pos
        {
            get { return _pos; }
            set
            {
                if (_pos != value)
                {
                    _pos = value;
                    RaisePropertyChanged("Pos");
                }
            }
        }

        /// <summary>
        /// Для первого этапа - это Количество позиций по фьючерсам, аннулированных в связи с тем, что они
        /// учитывались на регистрах с одним ИНН (кодом). Для второго этапа всегда 0       
        /// </summary>
        public int PosExcl
        {
            get { return _posExcl; }
            set
            {
                if (_posExcl != value)
                {
                    _posExcl = value;
                    RaisePropertyChanged("PosExcl");
                }
            }
        }

        /// <summary>
        /// Количество позиций, неисполненных в ходе данного этапа поставки
        /// </summary>
        public int PosUnexec
        {
            get { return _posUnexec; }
            set
            {
                if (_posUnexec != value)
                {
                    _posUnexec = value;
                    RaisePropertyChanged("PosUnexec");
                }
            }
        }

        /// <summary>
        /// Признак исполнения/неисполнения клиентом позиций, указанных в поле pos_neisp (False - исполнение, True - неисполнение)
        /// • Поле unexec может принимать следующие значения:
        ///0 Исполнение
        ///1 Неисполнение
        /// </summary>
        public int Unexec
        {
            get { return _unexec; }
            set
            {
                if (_unexec != value)
                {
                    _unexec = value;
                    RaisePropertyChanged("Unexec");
                }
            }
        }

        /// <summary>
        /// Код РПС
        /// </summary>
        public string SettlPair
        {
            get { return _settlPair; }
            set
            {
                if (_settlPair != value)
                {
                    _settlPair = value;
                    RaisePropertyChanged("SettlPair");
                }
            }
        }

        /// <summary>
        /// Торговый код поставляемого актива
        /// </summary>
        public string AssetCode
        {
            get { return _assetCode; }
            set
            {
                if (_assetCode != value)
                {
                    _assetCode = value;
                    RaisePropertyChanged("AssetCode");
                }
            }
        }

        /// <summary>
        /// Депозитарный код поставляемого актива
        /// </summary>
        public string IssueCode
        {
            get { return _issueCode; }
            set
            {
                if (_issueCode != value)
                {
                    _issueCode = value;
                    RaisePropertyChanged("IssueCode");
                }
            }
        }

        /// <summary>
        /// Объём обязательств в руб.
        /// </summary>
        public Decimal ObligRur
        {
            get { return _obligRur; }
            set
            {
                if (_obligRur != value)
                {
                    _obligRur = value;
                    RaisePropertyChanged("ObligRur");
                }
            }
        }

        /// <summary>
        /// Объём обязательств в бумагах, шт
        /// </summary>
        public long ObligQty
        {
            get { return _obligQty; }
            set
            {
                if (_obligQty != value)
                {
                    _obligQty = value;
                    RaisePropertyChanged("ObligQty");
                }
            }
        }

        /// <summary>
        /// Объём выполненных обязательств в руб
        /// </summary>
        public Decimal FulfilRur
        {
            get { return _fulfilRur; }
            set
            {
                if (_fulfilRur != value)
                {
                    _fulfilRur = value;
                    RaisePropertyChanged("FulfilRur");
                }
            }
        }

        /// <summary>
        /// Объём выполненных обязательств в бумагах, шт
        /// </summary>
        public long FulfilQty
        {
            get { return _fulfilQty; }
            set
            {
                if (_fulfilQty != value)
                {
                    _fulfilQty = value;
                    RaisePropertyChanged("FulfilQty");
                }
            }
        }

        /// <summary>
        /// Порядковый номер этапа поставки
        /// • Поле step при поставке по Спотам всегда принимает значение 1
        /// </summary>
        public int Step
        {
            get { return _step; }
            set
            {
                if (_step != value)
                {
                    _step = value;
                    RaisePropertyChanged("Step");
                }
            }
        }

        /// <summary>
        /// Идентификатор торговой сессии
        /// </summary>
        public int SessId
        {
            get { return _sessId; }
            set
            {
                if (_sessId != value)
                {
                    _sessId = value;
                    RaisePropertyChanged("SessId");
                }
            }
        }

        /// <summary>
        /// Идентификатор этапа формирования отчетов
        /// </summary>
        public int IdGen
        {
            get { return _idGen; }
            set
            {
                if (_idGen != value)
                {
                    _idGen = value;
                    RaisePropertyChanged("IdGen");
                }
            }
        }

        #endregion

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        #region processing
        public static DeliveryReport ParseDeliveryReport(Dictionary<String, String> relation)
        {
            DeliveryReport tmp = new DeliveryReport();
            tmp.Parse(relation);
            return tmp;
        }

        public void Parse(Dictionary<String, String> relation)
        {
            foreach (String field in relation.Keys)
            {
                String value = relation[field];

                switch (field)
                {
                    case "replID": long.TryParse(value, out _replId); break;
                    case "replRev": long.TryParse(value, out _replRev); break;
                    case "replAct": long.TryParse(value, out _replAct); break;
                    case "date": DateTime.TryParse(value, out _date); break;
                    case "client_code": _clientCode = value; break;
                    case "type": _type = value; break;
                    case "isin_id": int.TryParse(value, out _isinId); break;
                    case "pos": int.TryParse(value, out _pos); break;
                    case "pos_excl": int.TryParse(value, out _posExcl); break;
                    case "pos_unexec": int.TryParse(value, out _posUnexec); break;
                    case "unexec": int.TryParse(value, out _unexec); break;
                    case "settl_pair": _settlPair = value; break;
                    case "asset_code": _assetCode = value; break;
                    case "issue_code": _issueCode = value; break;
                    case "oblig_rur": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _obligRur); break;
                    case "oblig_qty": long.TryParse(value, out _obligQty); break;
                    case "fulfil_rur": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _fulfilRur); break;
                    case "fulfil_qty": long.TryParse(value, out _fulfilQty); break;
                    case "step": int.TryParse(value, out _step); break;
                    case "sess_id": int.TryParse(value, out _sessId); break;
                    case "id_gen": int.TryParse(value, out _idGen); break; 

                };
            }
        }

        public static void AddValueToObsColFutRejectedOrders(DeliveryReport tmp)
        {
            MainWindow.StaticLevel._dataProvider.DeliveryReportList.Add(tmp);
        }

        #endregion
    }
}
